home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Tools & Utilities
/
Collection of Tools and Utilities.iso
/
dskut
/
fix_disk.zip
/
CLEARFAT.ASM
< prev
next >
Wrap
Assembly Source File
|
1987-03-04
|
6KB
|
157 lines
PAGE ,132
TITLE Clear Disk File Allocation Table, Version 1.00, 04-Mar-1987
CODE SEGMENT BYTE PUBLIC 'CODE'
ASSUME CS:CODE,DS:CODE,ES:CODE,SS:CODE
ORG 5CH
FCB LABEL BYTE
ORG 100H
START: JMP BEGIN
SIGNON DB "Clear Disk File Allocation Table Program, Version 1.00",13,10
DB "SMG Software",13,10
DB "(C) Copyright 1987 Steven Georgiades",13,10,10,"$"
WARNING DB "ALL of the files on drive x: WILL be corrupted!!",7,7,13,10
DB "Proceed ONLY if your disk is already corrupted and",13,10
DB "you wish to make one last attempt to recover your data.",13,10
DB "For more information, refer to CLEARFAT.DOC.",13,10,10
DRV_PTR DB "ALL of the files on drive x: WILL be corrupted!!",7,7,13,10
DB "Do you wish to continue?",7,7," (Y/N) $"
SURE DB 13,10,"Are you SURE?",7,7," (Y/N) $"
ABRT_MSG DB 13,10,"Aborted!",7,13,10,"$"
DONE_MSG DB 13,10,10,"The FAT for drive x: has been cleared!",7,13,10,"$"
ERR_DRV DB "Invalid Drive Letter!",7,13,10,"$"
ERR_RD DB "Error Reading Boot Record!",7,13,10,"$"
FDSK_MSG DB "I REFUSE to Clear the FAT of a Fixed Disk!",7,13,10,"$"
DRIVE DB ?
FATCNT DW ?
FATSEC DW ?
MEDIA DB ?
SECSIZE DW ?
YBUF DB 2,?,?,?
BEGIN: PUSH AX ; Save Drive Validity Info
MOV AH,9 ; Output Sign-On Message
MOV DX,OFFSET SIGNON
INT 21H
POP AX ; Restore Drive Validity Info
CMP AL,0 ; If Invalid,
JE DRV_OK
MOV DX,OFFSET ERR_DRV ; Setup Pointer to Error Msg
ERR_OUT: MOV AH,9 ; Output Error Message
INT 21H
MOV AX,4C01H ; Exit to DOS (Return = 1)
INT 21H
DRV_OK: MOV AL,FCB[0] ; Read Drive Number
DEC AL
JNS NOT_DEF ; If Default,
MOV AH,19H ; Get Default Drive Number
INT 21H
NOT_DEF: MOV DRIVE,AL ; Convert Drive Number to Letter
ADD AL,'A'
MOV WARNING[26],AL ; Save in Four (4) Places
MOV DRV_PTR[26],AL
MOV DONE_MSG[21],AL
MOV BX,OFFSET FATBUF
MOV AL,DRIVE ; Read Disk Boot Record
MOV CX,1
MOV DX,0
INT 25H
JNC RD_OK
POPF
MOV DX,OFFSET ERR_RD
JMP ERR_OUT
RD_OK: POPF
CMP FATBUF[19],5000
JB NOT_HARD
MOV DX,OFFSET FDSK_MSG
JMP SHORT ERR_OUT
NOT_HARD: MOV AX,FATBUF[11] ; Save Sector Size
MOV SECSIZE,AX
MOV AL,BYTE PTR FATBUF[16] ; Save FAT Count
XOR AH,AH
MOV FATCNT,AX
MOV AL,BYTE PTR FATBUF[21] ; Save Media Descriptor Byte
MOV MEDIA,AL
MOV BX,FATBUF[22] ; Save Sectors per FAT
MOV FATSEC,BX
PUSH CS ; Point to FAT Buffer
POP ES
MOV DI,OFFSET FATBUF
MOV BX,FATSEC ; Outer Loop LCV = FATSEC
MOV CX,SECSIZE ; Inner Loop LCV = SECSIZE
MOV AL,MEDIA ; Setup Blank FAT
STOSB
DEC CX
MOV AL,0FFH
STOSB
DEC CX
STOSB
DEC CX
XOR AL,AL
FATLOOP: REP STOSB
MOV CX,SECSIZE
DEC BX
JNZ FATLOOP
MOV AH,9 ; Output Warning Message
MOV DX,OFFSET WARNING
INT 21H
CALL YESNO ; Continue?
JC ABORT ; No, Abort
MOV AH,9 ; Warn Again
MOV DX,OFFSET SURE
INT 21H
CALL YESNO ; Continue?
JC ABORT ; No, Abort
MOV CX,FATCNT ; Write FAT(s) to Disk
MOV DX,1
WR_LOOP: PUSH CX
PUSH DX
MOV AL,DRIVE ; Write FAT #1
MOV CX,FATSEC
MOV DX,1
MOV BX,OFFSET FATBUF
INT 26H
POPF
POP DX
POP CX
ADD DX,FATSEC
LOOP WR_LOOP
MOV AH,9 ; Output DONE Message
MOV DX,OFFSET DONE_MSG
INT 21H
MOV AX,4C00H ; Exit to DOS
INT 21H
ABORT: MOV AH,9 ; Output ABORT Message
MOV DX,OFFSET ABRT_MSG
INT 21H
MOV AX,4C02H ; Exit to DOS
INT 21H
YESNO: MOV AX,0C0AH ; Read from Keyboard
MOV DX,OFFSET YBUF
INT 21H
CMP YBUF[1],1 ; If No Response, Error
JNE YESNO1
MOV AL,YBUF[2] ; Read Character
AND AL,0DFH ; Convert to Upper Case
CMP AL,'Y' ; If 'Y', Done
JE YESNO2
YESNO1: STC ; Set Carry Flag
YESNO2: RET ; Done
FATBUF LABEL WORD
CODE ENDS
END START